/**
 * @file         bsc_msg_rtp.h
 * @brief        双mcu远程块数据传输组件 —— 组件主体对象定义
 * @note         对外公布
 * @author       Jpz(jinpuzhao@hopechart.com, 靳普诏)
 * @data         2022-12-19
 * @version      1.0
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author          <th>Description
 * <tr><td>2022-12-19    <td>1.0                   <td>Jpz             <td>创建初始版本
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */

#ifndef _BSC_MSG_RTP_H_
#define _BSC_MSG_RTP_H_

#include "bsc_msg_rtp/bsc_msg_rtp_common.h"
#include "bsc_msg_rtp/bsc_msg_rtp_monitor.h"
#include "bsc_msg_rtp/bsc_msg_rtp_upper.h"
#include "bsc_msg_rtp/bsc_msg_rtp_under.h"
#include "sfc/sfc_mutex.h"

#ifdef __cplusplus
extern "C"

{
#endif

typedef struct TBsMsgRtpTag TBsMsgRtp;
struct TBsMsgRtpTag
{
    const TBsMsgRtpCfg    *cfg_;           ///< 属性配置单
    UInt32              send_tick_;     ///< 下次执行重发动作的tick值。
    UInt8               *rx_buff_;      ///< 用于获取数据的临时缓存数组。内部不做安全性检查，数组大小要求：大于2，且大于数据块长度。
    IBsMsgRtpUnder        *under_api_;    ///< 下层数据操作API。外部实现向内满足
    IBsMsgRtpUpper        upper_api_;     ///< 上层数据操作API。内部实现向外提供
    TBsMsgRtpMonitor      monitor_;       ///< 消息数据监视器。
    TBsMsgRtpTxCache      cache_;         ///< 消息发送缓存区。
    TSfCriticalSection  mutex_;         ///< 互斥锁保证多线程安全。
};

/*~~~~~~~~~~~~~ 初始化/反初始化/任务执行 ~~~~~~~~~~~~*/

/**
 * 初始化框架对象
 * @param self  框架对象句柄
 * @param *cfg  属性配置
 * @param *rx_buff  获取数据的临时缓存数组。内部不做安全性检查，数组大小要求：大于2，且大于数据块长度
 * @param rx_buff_size 临时缓存可用大小。创建时与cfg中帧数据大小比较
 * @return 成功 == 0
 *         失败 <  0 (参见，错误码网站解析结果)
 */
Int32 TBsMsgRtpCreate(TBsMsgRtp *self, const TBsMsgRtpCfg *cfg, UInt8 *rx_buff, UInt32 rx_buff_size);

/**
 * 反初始化框架对象
 * @param *self 框架对象句柄
 * @return 
 */
void TBsMsgRtpDestroy(TBsMsgRtp *self);

/**
 * 执行一次任务: 接收底层消息 -> 执行重发操作
 * @param *self 框架对象句柄
 * @return 成功 == 0
 *         失败 <  0 (参见，错误码网站解析结果)
 */
Int32 TBsMsgRtpRunOnce(TBsMsgRtp *self);

/*~~~~~~~~~~~~~~~~~~ 监视器接口相关 ~~~~~~~~~~~~~~~~~*/

/**
 * 获取消息数据监视器对象指针
 * @param *self 框架对象句柄
 * @return 成功 接口指针
 *         失败 NULL
 */
TBsMsgRtpMonitor *TBsMsgRtpMonitorHandle(TBsMsgRtp *self);

/*~~~~~~~~~~~~~~~~~~ 应用数据操作接口相关 ~~~~~~~~~~~~~~~~~*/

/**
 * 获取应用数据操作接口指针
 * @param *self 框架对象句柄
 * @return 成功 接口指针
 *         失败 NULL
 */
IBsMsgRtpUpper *TBsMsgRtpUpperInterface(TBsMsgRtp *self);

/*~~~~~~~~~~~~~~~~~~ 底层数据操作接口相关 ~~~~~~~~~~~~~~~~~*/

/**
 * 设置底层数据操作接口
 * @param self          框架对象句柄
 * @param *under_api    底层数据接口。
 * @return 成功 == 0
 *         失败 <  0 (参见，错误码网站解析结果)
 */
Int32 TBsMsgRtpSetUnderInterface(TBsMsgRtp *self, const IBsMsgRtpUnder *under_api);

/**
 * 获取底层数据操作接口指针
 * @param *self 框架对象句柄
 * @return 成功 接口指针
 *         失败 NULL
 */
IBsMsgRtpUnder *TBsMsgRtpUnderInterface(TBsMsgRtp *self);

/*~~~~~~~~~~~~~~~~~~ 属性操作相关 ~~~~~~~~~~~~~~~~~*/

/**
 * 获取配置项的发送缓存地址
 * @param *self
 * @return 发送缓存地址
 */
UInt8 *TBsMsgRtpCfgTxBuff(TBsMsgRtp *self);

/**
 * 获取配置项的发送缓存地址大小
 * @param *self
 * @return 发送缓存地址大小
 */
UInt32 TBsMsgRtpCfgTxBuffSize(TBsMsgRtp *self);

/**
 * 获取配置项数据块大小
 * @param *self
 * @return 数据块大小
 */
UInt16 TBsMsgRtpCfgMsgSize(TBsMsgRtp *self);


#ifdef __cplusplus
}  ///< extern "C"
#endif

#endif  ///< _BSC_MSG_RTP_H_


